/**
 ****************************************************************************************************
 * @file        foc_port.c
 * @author      哔哩哔哩-Rebron大侠
 * @version     V0.0
 * @date        2025-01-11
 * @brief       该FOC库所调用的一些硬件接口
 * @license     MIT License
 *              Copyright (c) 2025 Reborn大侠
 *              允许任何人使用、复制、修改和分发该代码，但需保留此版权声明。
 ****************************************************************************************************
 */

#include "foc_port.h"
#include "foc_current.h"
#include  "foc_motor.h"
#include <stdbool.h>

/*打开FOC需要的硬件接口*/
void FOC_Port_Start(void)
{
    /*PWM相关*/
    HAL_TIM_Base_Start_IT(&htim1);                          /*开启PWM的定时器周期中断*/
    HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_4);             /*开启通道四的触发中断*/

    /* ABZ增量编码器 */
    HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);         /*开启定时器编码器模式*/
    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);             /*开启定时器捕获, 捕获编码器Z相*/

    /* 霍尔编码器 */
    HAL_TIM_Base_Start_IT(&htim3);                          /* 开启周期中断 */
    HAL_TIMEx_HallSensor_Start_IT(&htim3);                  /* 开启霍尔中断 */

    /*开启定时器的周期中断*/
    HAL_TIM_Base_Start_IT(&htim6);                          /*开启定时器周期中断， 用于做一些速度计算之类的*/
    

    // U_H_SET_PWM(4200*0.9);
    // V_H_SET_PWM(4200*0.9);
    // W_H_SET_PWM(4200*0.9);
    // FOC_Port_Pwm_Start();
}

/*关闭FOC需要的硬件接口*/
void FOC_Port_Stop(void)
{
    /*PWM相关*/
    HAL_TIM_Base_Stop_IT(&htim1);                          
    HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_4);             

    /* ABZ增量编码器 */
    HAL_TIM_Encoder_Stop(&htim3, TIM_CHANNEL_ALL);      
    HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_2);             

    /* 霍尔编码器 */
    HAL_TIM_Base_Stop_IT(&htim3);
    HAL_TIMEx_HallSensor_Stop_IT(&htim3);

    HAL_TIM_Base_Stop_IT(&htim6);

    FOC_Port_Pwm_Stop();
}

/*打开PWM*/
void FOC_Port_Pwm_Start(void)
{
    MOTOR_ENABLE;                               /*半桥芯片使能 我的板子上没有这个使能引脚*/

    /*开启6路PWM*/
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
}

/*关闭PWM*/
void FOC_Port_Pwm_Stop(void)
{
    MOTOR_DISENABLE;

    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);
}





/************************************电流采集******************************************/
#include <adc.h>
/*
电流更新
注入通道 本工程用相采 有的方案是用低端电阻采样，需要根据具体的方案进行更改
*/
void Foc_Current_Refresh(FOC_MOTOR_t *foc_motor)
{
    FOC_CURRENT_t *foc_cur = &foc_motor->current;

    
    switch(foc_motor->motor_state){
        case MOTOR_IDLE_START:
            /*进行偏移校准*/
            foc_cur->mcu_ad_C += hadc1.Instance->JDR3;
            foc_cur->mcu_ad_B += hadc1.Instance->JDR2;
            foc_cur->mcu_ad_A += hadc1.Instance->JDR1;

            /*DMA采集方式*/
            // _U_val += CC6920SO_GetAdcVal(0);         
            // _V_val += CC6920SO_GetAdcVal(1);
            // _W_val += CC6920SO_GetAdcVal(2);
   
            break;
        case MOTOR_START:
        case MOTOR_OPEN_RUN:
        case MOTOR_HALL_RUN:
        case MOTOR_ENC_RUN:
        case MOTOR_SL_RUN:
            /*以上状态下都进行电流采样  减去零漂*/
            foc_cur->mcu_ad_C = hadc1.Instance->JDR3 - foc_cur->_C_ad_offset;
            foc_cur->mcu_ad_B = hadc1.Instance->JDR2 - foc_cur->_B_ad_offset;
            foc_cur->mcu_ad_A = hadc1.Instance->JDR1 - foc_cur->_A_ad_offset;

            /*DMA采集方式*/
            // _U_val = CC6920SO_GetAdcVal(0);         
            // _V_val = CC6920SO_GetAdcVal(1);
            // _W_val = CC6920SO_GetAdcVal(2);

            /*计算三相电流*/
            foc_cur->I_abc.a = (foc_cur->mcu_ad_A);
            foc_cur->I_abc.b = (foc_cur->mcu_ad_B);
            foc_cur->I_abc.c = (foc_cur->mcu_ad_C);

            break;
        default:
            break;
    }

    
}

/******************************************************************************/
